import {createRouter, createWebHashHistory} from 'vue-router';
import { ElNotification } from 'element-plus';
import config from "@/config"
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import tool from '@/utils/tool';
import systemRouter from './systemRouter';
import userRoutes from '@/config/route';
import {beforeEach, afterEach} from './scrollBehavior';
import API from "@/api";

//系统路由
const routes = systemRouter

//系统特殊路由
const routes_404 = {
	path: "/:pathMatch(.*)*",
	hidden: true,
	component: () => import(/* webpackChunkName: "404" */ '@/layout/other/404'),
}
let routes_404_r = ()=>{}

const router = createRouter({
	history: createWebHashHistory(),
	routes: routes
})

//设置标题
document.title = config.APP_NAME

//判断是否已加载过动态/静态路由
var isGetRouter = false;

router.beforeEach(async (to, from, next) => {
	let roleType = ''
	if(JSON.parse(localStorage.getItem('USER_INFO'))) {
		roleType = JSON.parse(localStorage.getItem('USER_INFO')).content.roleType
	}
	if( roleType== 3) {
		userRoutes[0].children = [
			{
				name: "welcomePartners",
				path: "/welcomePartners",
				component: "home/widgets/components/welcomePartners",
				meta: {
					icon: "el-icon-user-filled",
					title: "控制台",
					role: ["SA", "leader", "employee", "manufacturer"],
				},
			},
		];
	} else {
		userRoutes[0].children = [
			{
				name: "dashboard",
				path: "/dashboard",
				component: "home/widgets/components/welcome",
				meta: {
					icon: "el-icon-user-filled",
					title: "工作职责",
					role: ["SA","leader", "employee", "manufacturer"]
				},
			},{
				name: "dataAnalysis",
				path: "/dataAnalysis",
				component: "home/dataAnalysis/index",
				meta: {
					icon: "el-icon-user-filled",
					title: "数据分析",
					role: ["SA","leader", "employee", "manufacturer"]
				},
			}
		];
	}
	NProgress.start()
	//动态标题
	document.title = to.meta.title ? `${to.meta.title} - ${config.APP_NAME}` : `${config.APP_NAME}`

	let token = tool.cookie.get("TOKEN");
	console.log(token)
	if(to.path === "/login" ){
		if(token) {
			next('/')

		}else {
			//删除路由(替换当前layout路由)
			router.addRoute(routes[0])
			//删除路由(404)
			routes_404_r()
			isGetRouter = false;
			next();
			return false;
		}

	}

	if(routes.findIndex(r => r.path === to.path) >= 0){
		next();
		return false;
	}
	/* 单点登录 */
	if (to.query.token) {
		tool.cookie.set("TOKEN", to.query.token, {
			expires: 24 * 60 * 60
		})
		const resUserData = await API.auth.getUserInfo.get()
		if (!resUserData) {
			ElNotification.error({
				title: '提示',
				message: '登录信息已失效,请重新登陆!'
			});
			return
		}
		setRoleIdList(resUserData)
		next('/keynote')
		ElNotification.success({
			title: '提示',
			message: "Login Success 登录成功"
		});
	}

	if(!token){
		next({
			path: '/login'
		});
		return false;
	}

	//整页路由处理
	if(to.meta.fullpage){
		to.matched = [to.matched[to.matched.length-1]]
	}
	//加载动态/静态路由
	if(!isGetRouter){
		let apiMenu = tool.data.get("MENU") || []
		let userInfo = tool.data.get("USER_INFO")
		let userMenu = treeFilter(userRoutes, node => {
			return node.meta && node.meta.role ? node.meta.role.filter(item=>userInfo.role.indexOf(item)>-1).length > 0 : true
		})
		let menu = [...userMenu, ...apiMenu]
		var menuRouter = filterAsyncRouter(menu)
		menuRouter = flatAsyncRoutes(menuRouter)
		menuRouter.forEach(item => {
			router.addRoute("layout", item)
		})
		routes_404_r = router.addRoute(routes_404)
		if (to.matched.length == 0) {
			router.push(to.fullPath);
		}
		isGetRouter = true;
	}

	beforeEach(to, from)
	next();
});

router.afterEach((to, from) => {
	afterEach(to, from)
	NProgress.done()
});

router.onError((error) => {
	NProgress.done();
	ElNotification.error({
		title: '路由错误',
		message: error.message
	});
});

//入侵追加自定义方法、对象
router.sc_getMenu = () => {
	var apiMenu = tool.data.get("MENU") || []
	let userInfo = tool.data.get("USER_INFO")
	let userMenu = treeFilter(userRoutes, node => {
		return node.meta.role ? node.meta.role.filter(item=>userInfo.role.indexOf(item)>-1).length > 0 : true
	})
	var menu = [...userMenu, ...apiMenu]
	return menu
}

//转换
function filterAsyncRouter(routerMap) {
	const accessedRouters = []
	routerMap.forEach(item => {
		item.meta = item.meta?item.meta:{};
		//处理外部链接特殊路由
		if(item.meta.type=='iframe'){
			item.meta.url = item.path;
			item.path = `/i/${item.name}`;
		}
		//MAP转路由对象
		var route = {
			path: item.path,
			name: item.name,
			meta: item.meta,
			redirect: item.redirect,
			children: item.children ? filterAsyncRouter(item.children) : null,
			component: loadComponent(item.component)
		}
		accessedRouters.push(route)
	})
	return accessedRouters
}
function loadComponent(component){
	if(component){
		return () => import(/* webpackChunkName: "[request]" */ `@/views/${component}`)
	}else{
		return () => import(`@/layout/other/empty`)
	}

}

//路由扁平化
function flatAsyncRoutes(routes, breadcrumb=[]) {
	let res = []
	routes.forEach(route => {
		const tmp = {...route}
        if (tmp.children) {
            let childrenBreadcrumb = [...breadcrumb]
            childrenBreadcrumb.push(route)
            let tmpRoute = { ...route }
            tmpRoute.meta.breadcrumb = childrenBreadcrumb
            delete tmpRoute.children
            res.push(tmpRoute)
            let childrenRoutes = flatAsyncRoutes(tmp.children, childrenBreadcrumb)
            childrenRoutes.map(item => {
                res.push(item)
            })
        } else {
            let tmpBreadcrumb = [...breadcrumb]
            tmpBreadcrumb.push(tmp)
            tmp.meta.breadcrumb = tmpBreadcrumb
            res.push(tmp)
        }
    })
    return res
}

//过滤树
function treeFilter(tree, func) {
	return tree.map(node => ({ ...node })).filter(node => {
		node.children = node.children && treeFilter(node.children, func)
		return func(node) || (node.children && node.children.length)
	})
}

/* 菜单权限控制*/
 function setRoleIdList(resUserData) {
	resUserData.data.roleIdList.forEach(
		e => {
			console.log(2111111111111)
			console.log(e)
			if (e === "8364470471658029056") {
				resUserData.data.role = [
					"leader"
				]
			}
			if (e === "8517750998110257152") {
				resUserData.data.role = [
					"manufacturer"
				]
			}
			if (e === "8364470366079008768") {
				resUserData.data.role = [
					"employee"
				]
			}
			if (e === "8387242193394475008") {
				resUserData.data.role = [
					"manufacturer"
				]
			}
		}
	)
	if (resUserData.data.roleIdList.includes('8357590026640801792')) {
		resUserData.data.role.push('SA')
	}
	resUserData.data.dashboard = "0"
	tool.data.set("USER_INFO", resUserData.data)
	localStorage.setItem('phone', resUserData.data.mobile)
}

export default router
